package top.fengleifeng.question;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * @program: leetcode-test
 * @description: 给定一副牌，每张牌上都写着一个整数。
 * <p>
 * 此时，你需要选定一个数字 X，使我们可以将整副牌按下述规则分成 1 组或更多组：
 * <p>
 * 每组都有 X 张牌。
 * 组内所有的牌上都写着相同的整数。
 * 仅当你可选的 X >= 2 时返回 true。
 * <p>
 *  
 * <p>
 * 示例 1：
 * <p>
 * 输入：[1,2,3,4,4,3,2,1]
 * 输出：true
 * 解释：可行的分组是 [1,1]，[2,2]，[3,3]，[4,4]
 * 示例 2：
 * <p>
 * 输入：[1,1,1,2,2,2,3,3]
 * 输出：false
 * 解释：没有满足要求的分组。
 * 示例 3：
 * <p>
 * 输入：[1]
 * 输出：false
 * 解释：没有满足要求的分组。
 * 示例 4：
 * <p>
 * 输入：[1,1]
 * 输出：true
 * 解释：可行的分组是 [1,1]
 * 示例 5：
 * <p>
 * 输入：[1,1,2,2,2,2]
 * 输出：true
 * 解释：可行的分组是 [1,1]，[2,2]，[2,2]
 * <p>
 * 提示：
 * <p>
 * 1 <= deck.length <= 10000
 * 0 <= deck[i] < 10000
 *  
 * <p>
 * 通过次数41,618提交次数106,437
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @author: fengleifeng
 * @create: 2020-09-30 12:04
 **/
public class Num914卡牌分组 {
    class Solution {
        public boolean hasGroupsSizeX(int[] deck) {
            if (deck.length < 2) {
                return false;
            }
            Map<Integer, Integer> map = new HashMap();
            for (int i = 0; i < deck.length; i++) {
                if (map.containsKey(deck[i])) {
                    map.put(deck[i], map.get(deck[i]) + 1);
                } else {
                    map.put(deck[i], 1);
                }
            }
            Integer first = null;
            boolean flag = false;
            Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry<Integer, Integer> entry = iterator.next();
                int val = entry.getValue();
                if (!flag) {
                    first = val;
                    flag = true;
                } else {
                    first = getGCD(first, val);
                    if(first<=1){
                        return false;
                    }
                }
            }

            return true;
        }

        public int getGCD(int a, int b) {
            if (a < 0 || b < 0) {
                return -1; // 数学上不考虑负数的约数
            }
            if (b == 0) {
                return a;
            }
            while (a % b != 0) {
                int temp = a % b;
                a = b;
                b = temp;
            }
            return b;
        }
        private int gcd(int a, int b) {
            if (b == 0) {
                return a;
            }
            return gcd(b, a % b);
        }

    }

    public static void main(String[] args) {
//        int[] ints = {1,2,3,4,4,3,2,1};
//        int[] ints = {1, 1, 1, 2, 2, 2, 3, 3};
//        int[] ints = {1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3};
        int[] ints = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,3,3,4,4,4,4,4,4,5,5,6,6,7,7};
        boolean b = new Num914卡牌分组().new Solution().hasGroupsSizeX(ints);
        System.out.println(b);
    }
}
